function countHillValley(nums) {
  const n = nums.length;
  if (n < 3) return 0; // 数组长度小于3时，不可能有峰或谷

  // 计算每个下标左侧最近的不相等元素
  const left = new Array(n).fill(null);
  for (let i = 0; i < n; i++) {
    let j = i - 1;
    while (j >= 0 && nums[j] === nums[i]) {
      j--;
    }
    if (j >= 0) {
      left[i] = nums[j];
    }
  }

  // 计算每个下标右侧最近的不相等元素
  const right = new Array(n).fill(null);
  for (let i = 0; i < n; i++) {
    let j = i + 1;
    while (j < n && nums[j] === nums[i]) {
      j++;
    }
    if (j < n) {
      right[i] = nums[j];
    }
  }

  let count = 0;
  let prevType = null; // 记录上一个峰或谷的类型（'peak' 或 'valley'）

  for (let i = 0; i < n; i++) {
    const lv = left[i];
    const rv = right[i];
    // 左右两侧若不存在不相等邻居，则跳过
    if (lv === null || rv === null) {
      prevType = null;
      continue;
    }

    const current = nums[i];
    const isPeak = current > lv && current > rv;
    const isValley = current < lv && current < rv;

    // 既不是峰也不是谷，跳过
    if (!isPeak && !isValley) {
      prevType = null;
      continue;
    }

    const currentType = isPeak ? "peak" : "valley";

    // 检查当前下标是否与前一个下标属于同一峰或谷（连续相等且同类型）
    if (i > 0 && nums[i] === nums[i - 1] && prevType === currentType) {
      continue; // 属于同一峰或谷，不重复计数
    } else {
      count++;
      prevType = currentType;
    }
  }

  return count;
}
